package com.itheima.ydd.controller;


import com.itheima.ydd.common.FileInfo;
import com.itheima.ydd.common.ResultData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.MediaTypeFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;


@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${ydd.backPath}")
    private String backPath;

    @Value("${ydd.frontPath}")
    private String frontPath;

    @PostMapping("/upload")
    public ResultData upload(MultipartFile file, HttpServletRequest request) {

        //file是一个临时工文件，需要转存到指定位置，否则本次请求完成后临时文件会删除
        log.info("sss" + file.toString());

        //获取原始文件名(将临时文件转存到本地磁盘)
        String originalFilename = file.getOriginalFilename();
        //动态截取原始文件名的后缀(对原始文件，重新命名，防止文件覆盖)
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名，防止文件名称重复造成文件覆盖
        String fileName = UUID.randomUUID() + suffix;

        //创建一个目录对象(对文件上传目录做健壮性判断)
        File dir = new File(backPath);
        //判断当前目录是否存在
        if (!dir.exists()) {
            //目录不存在,需要创建
            dir.mkdirs();
        }

        try {
            //将临时文件转存到指定位置(转存到指定文件)
            //这里是后台图片的存放
            File file1 = new File(backPath + fileName);
            file.transferTo(file1);
            //这里需要注意的是：临时文件一旦transferTo 给了 backpath ，那么就会消失
            //创建一个新的file对象 ，指定前台路径和名称
            File frontFile = new File(frontPath , fileName);
            //通过对象的copy ， 将后台文件存放的dir ，拷贝给前台
            FileUtils.copyFile(file1 , frontFile);

        } catch (IOException e) {
            e.printStackTrace();
        }

        //获取图片类型
        String mime = "";
        Optional<MediaType> mediaType = MediaTypeFactory.getMediaType(originalFilename);
        if (mediaType.isPresent()) {
            mime = mediaType.get().toString();
        }

        FileInfo fileInfo = new FileInfo();
        fileInfo.setSavePath("upload/images/" + fileName);
        fileInfo.setName(originalFilename);
        fileInfo.setMime(mime);
        fileInfo.setSize(file.getSize());

        return ResultData.ok("", fileInfo);

    }
}